//
//  YMSStatusDal.swift
//  YMSWeibo
//
//  Created by 杨茂盛 on 2016/11/25.
//  Copyright © 2016年 杨茂盛. All rights reserved.
//

import UIKit

//设置多少秒之后过期
private let expires_date_timeIntravel: Double = -7 * 24*60*60


class YMSStatusDal: NSObject {
    //首页数据的迁移
    class func loadHomeData(sinceId: Int64,maxId: Int64,finished: @escaping ([[String : Any]]?) -> ()) {
        let res = checkoutStatus(sinceId: sinceId, maxId: maxId)
        //if let result ',' 可以获取到赋值的结果
        if let result = res, result.count > 0 {
            //有缓存数据  返回缓存数据
            //TODO: 待返回
            finished(result)
            return
        }
        
        //没有缓存数据, 请求网络数据
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        let parameters = ["access_token" : YMSUserinfoViewModel.shared.access_token,
                          "max_id" : "\(maxId)",
            "since_id" : "\(sinceId)"]
        
        YMSNetWorkToll.shared.request(method: .GET, urlString: urlString, parameters: parameters, finished: { (responseObject,error) -> () in
            if error != nil {
                //告诉外界请求失败 在闭包中如何完成失败的回调
                //TODO: 完成失败的回调
                finished(nil)
                return
            }
            
            //成功
            let dict = responseObject as! [String : Any]
            //尝试转换为字典类型的数组
            guard let array = dict["statuses"] as? [[String : Any]] else {
                finished(nil)
                return
            }
            
            //回调的网络 请求的结果
            finished(array)
            //存储到本地
            cacheStauts(array: array)
        })
    }


    
    //1.检查本地是否有缓存数据
    class func checkoutStatus(sinceId:Int64,maxId:Int64)-> [[String:Any]]?{
        
        //查询的sql
        guard let userId = YMSUserinfoViewModel.shared.userAccount?.uid else{
            
        return nil
            
        }
        //会将数据库中所有的缓存数据都查找出来
        var sql = "SELECT status FROM Yms_Status WHERE userId = \(userId) "
        //拼接sql
        
        //如果sinceId > 0 表示需要查找新的数据
        if sinceId > 0 {
            //向上查找
        sql += "AND statusId > \(sinceId) "
            
        }
        if maxId > 0 {
        //向下查找
            sql += "AND statusId < \(maxId) "
        }
        //排序降序
        sql += "ORDER BY statusId DESC "
        //限制条数
        sql += "LIMIT 20"
        
        //print(sql)
        
        //实例化数据
        var array = [[String : Any]]()
        YMSSQLiteTools.shared.queue.inDatabase { (db) in
            let res = db!.executeQuery(sql, withArgumentsIn: nil)
            //逐条获取数据
            while res!.next() {
                //获取status二进制数据
                //                let jsonData = res?.date(forColumn: "status")  //data 和 date的区别
                let jsondata1 = res?.data(forColumn: "status")
                //转换为字典
                // let dict = try! JSONSerialization.jsonObject(with: jsonData!, options: [])
                let dict = try! JSONSerialization.jsonObject(with:jsondata1!, options: [])
                
                array.append(dict as! [String:Any])
                
            }
        }
        return array
    }
    //2.如果本地有缓存数据 就直接返回本地的缓存数据,给用户节省流量,让用户在没有网络的情况下可以访问之前的内容
    //3.没有缓存数据就请求网络数据 返回网络数据
    //4.获取网络数据之后就应该立即存储网络数据
    
    class func cacheStauts(array:[[String:Any]]){ //参数为字典数组
        //获取userId
        guard let userId = YMSUserinfoViewModel.shared.userAccount?.uid else{
            print("用户没有登录")
            return
        }
        
        //sql 插入新的数据
        let sql = "INSERT OR REPLACE INTO Yms_Status (statusId,status,userId) VALUES (?,?,?)"
        YMSSQLiteTools.shared.queue.inTransaction { (db, rollBack) in
            //遍历循环外界传来的数据,存储起来
            for item in array{
                let statusId = item["id"]!
                //数据库中能够存储的数据不能够是Foundation 需要将字典数据转换二进制数据存储到数据库中
                //如果是字典数据 在读取的时候会有问题
                let jsonData = try! JSONSerialization.data(withJSONObject: item, options: [])
                let res = db!.executeUpdate(sql, withArgumentsIn: [statusId,jsonData,userId])
                
                if !res{
                //不成功就执行回滚
                    rollBack?.pointee = true
                    return
                }
            }
            
        }
        
    }
    
    //在什么时候清除 7天之前的微博
    class func clearCacheStatus(){
    //根据设置的过期描述 和当前过期日期 计算需要删除的微博记录
        let exprires_date = Date(timeIntervalSinceNow: expires_date_timeIntravel)
        
        //yyyy-MM-dd HH:mm:ss
        let formater = DateFormatter()
        
        //设置本地化信息
        formater.locale = Locale(identifier: "en")
        //设置格式化符
        formater.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //获取日期的字符串
        let dateStr = formater.string(from: exprires_date)
        let sql = "DELETE FROM Y_Status WHERE create_date < ?"
        
        //执行sql
        YMSSQLiteTools.shared.queue.inTransaction { (db, rollback) in
            
            let res = db!.executeUpdate(sql, withArgumentsIn: [dateStr])
            
            if !res{
            rollback?.pointee = true
            }
        }
    }
}
